package br.com.pontoe.model.persistencia;


import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import br.com.pontoe.model.conexao.Conexao;
import br.com.pontoe.model.entidades.Usuario;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

/**
 * DAO para entidade Usuario
 * 
 * @author Cleison
 * @version 1.0
 * @since 09/05/2010
 */
public class UsuarioDAO implements DAOInterface<Usuario> {

	private StringBuilder sql = new StringBuilder();
	private Connection con = null;
	private PreparedStatement stm = null;

	@Override
	public int adicionar(Usuario entidade) throws SQLException {
		int ret= -1;

		try {
			sql = new StringBuilder();
			sql
					.append("INSERT INTO USUARIO (MATRICULA, NOME, NASCIMENTO, TELEFONE, SENHA, IDENDERECO) ");
			sql.append("VALUES (NULL, ?, ?, ?, ?, ?)");

			con = Conexao.getInstance().getConnection();
			stm = (PreparedStatement) con.prepareStatement(sql.toString());

			stm.setString(1, entidade.getNome());
			stm.setTimestamp(2, new Timestamp(entidade.getNascimento().getTime()));
			stm.setString(3, entidade.getTelefone());
			stm.setInt(4, entidade.getSenha());
			stm.setInt(5, entidade.getEndereco().getId());

			stm.executeUpdate();
			ret =(int)stm.getLastInsertID();

		} finally {
			stm.close();
			con.close();
		}
		return ret;
	}

	@Override
	public boolean atualizar(Usuario entidade) throws SQLException {
		boolean ret = true;

		try {
			sql = new StringBuilder();
			sql.append("UPDATE USUARIO ");
			sql.append("SET   NOME = ?, NASCIMENTO = ?, TELEFONE = ?, SENHA = ?, IDENDERECO = ? ");
			sql.append("WHERE MATRICULA = ? ");

			con = Conexao.getInstance().getConnection();
			stm = (PreparedStatement) con.prepareStatement(sql.toString());

			stm.setString(1, entidade.getNome());
			stm.setTimestamp(2, new Timestamp(entidade.getNascimento().getTime()));
			stm.setString(3, entidade.getTelefone());
			stm.setInt(4, entidade.getSenha());
			stm.setInt(5, entidade.getEndereco().getId());
			stm.setInt(6, entidade.getMatricula());

			ret = stm.execute();
		} finally {
			stm.close();
			con.close();
		}
		return ret;
	}

	@Override
	public Usuario localizar(int matricula) throws SQLException {
		Usuario ret = null;

		try {
			sql = new StringBuilder();
			sql
					.append("SELECT  MATRICULA, NOME, NASCIMENTO, TELEFONE, SENHA, IDENDERECO ");
			sql.append("FROM 	USUARIO ");
			sql.append("WHERE 	MATRICULA = ? ");

			con = Conexao.getInstance().getConnection();
			stm = (PreparedStatement) con.prepareStatement(sql.toString());

			stm.setInt(1, matricula);

			ResultSet temp = stm.executeQuery();
			EnderecoDAO eTmp = new EnderecoDAO();

			if (temp.next()) {
				ret = new Usuario();
				ret.setMatricula(temp.getInt("MATRICULA"));
				ret.setNome(temp.getString("NOME"));
				ret.setNascimento(temp.getDate("NASCIMENTO"));
				ret.setTelefone(temp.getString("TELEFONE"));
				ret.setSenha(temp.getInt("SENHA"));
				ret.setEndereco(eTmp.localizar(temp.getInt("IDENDERECO")));
			}
			temp.close();
		} finally {
			stm.close();
			con.close();
		}
		return ret;
	}

	@Override
	public List<Usuario> localizarTodos() throws SQLException {
		List<Usuario> ret = new ArrayList<Usuario>();

		try {
			sql = new StringBuilder();
			sql
					.append("SELECT  MATRICULA, NOME, NASCIMENTO, TELEFONE, SENHA, IDENDERECO ");
			sql.append("FROM 	USUARIO ");

			con = Conexao.getInstance().getConnection();
			stm = (PreparedStatement) con.prepareStatement(sql.toString());

			ResultSet temp = stm.executeQuery();
			EnderecoDAO eTmp = new EnderecoDAO();

			if (temp.next()) {
				Usuario u = new Usuario();
				u.setMatricula(temp.getInt("MATRICULA"));
				u.setNome(temp.getString("NOME"));
				u.setNascimento(temp.getDate("NASCIMENTO"));
				u.setTelefone(temp.getString("TELEFONE"));
				u.setSenha(temp.getInt("SENHA"));
				u.setEndereco(eTmp.localizar(temp.getInt("IDENDERECO")));
			}
			temp.close();
		} finally {
			stm.close();
			con.close();
		}
		return ret;
	}

	@Override
	public boolean remover(Usuario entidade) throws SQLException {
		boolean ret = true;

		try {
			sql = new StringBuilder();
			sql.append("DELETE FROM USUARIO ");
			sql.append("WHERE MATRICULA = ? ");

			con = Conexao.getInstance().getConnection();
			stm = (PreparedStatement) con.prepareStatement(sql.toString());

			stm.setInt(1, entidade.getMatricula());

			ret = stm.execute();
		} finally {
			stm.close();
			con.close();
		}
		return ret;
	}

	
	/**
	 * Metodo Adicionados
	 * 
	 * @author Rodolfo
	 * @version 1.1
	 * @since 15/05/2010
	 **/
	public int adicionarRetId(Usuario entidade) throws SQLException {
		int id =0;//add e retorna o id gerado pelo campo auto incremento
		
		try {
			sql = new StringBuilder();
			sql.append("INSERT INTO USUARIO (MATRICULA, NOME, NASCIMENTO, TELEFONE, SENHA, IDENDERECO) ");
			sql.append("VALUES (NULL, ?, ?, ?, ?, ?)");

			con = Conexao.getInstance().getConnection();
			stm = (PreparedStatement) con.prepareStatement(sql.toString());

			stm.setString(1, entidade.getNome());
			stm.setDate(2, null);
			stm.setString(3, entidade.getTelefone());
			stm.setInt(4, entidade.getSenha());
			stm.setInt(5, entidade.getEndereco().getId());
			
			
			stm.executeUpdate();
			
		}
		finally {
			stm.close();
			con.close();
		}
		return id;
	}
	
	public Usuario locPorNomeSenha(String nome,int senha) throws SQLException {
		Usuario ret = null;

		try {
			sql = new StringBuilder();
			sql
					.append("SELECT  MATRICULA, NOME, NASCIMENTO, TELEFONE, SENHA, IDENDERECO ");
			sql.append("FROM 	USUARIO ");
			sql.append("WHERE 	NOME = ? AND SENHA=?");

			con = Conexao.getInstance().getConnection();
			stm = (PreparedStatement) con.prepareStatement(sql.toString());

			stm.setString(1, nome);
			stm.setInt(2, senha);

			ResultSet temp = stm.executeQuery();
			EnderecoDAO eTmp = new EnderecoDAO();

			if (temp.next()) {
				ret = new Usuario();
				ret.setMatricula(temp.getInt("MATRICULA"));
				ret.setNome(temp.getString("NOME"));
				ret.setNascimento(temp.getDate("NASCIMENTO"));
				ret.setTelefone(temp.getString("TELEFONE"));
				ret.setSenha(temp.getInt("SENHA"));
				ret.setEndereco(eTmp.localizar(temp.getInt("IDENDERECO")));
			}
			temp.close();
		} finally {
			stm.close();
			con.close();
		}
		return ret;
	}
	
	
}
